package main

import (
	"encoding/json"
	"fmt"
	"github.com/miekg/dns"
	"gopkg.in/yaml.v3"
	"lktx-dns/bean"
	"lktx-dns/config"
	"lktx-dns/handler"
	"lktx-dns/proxy"
	"lktx-dns/service"
	"lktx-dns/web"
	"log"
	"os"
	"path/filepath"
	"strconv"
)

func loadConfig(filename string) (*bean.DNSConfig, error) {
	file, err := os.Open(filename)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {

		}
	}(file)
	var config bean.DNSConfig
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&config)
	if err != nil {
		return nil, fmt.Errorf("配置文件格式错误: %w", err)
	}
	return &config, nil
}

func main() {
	log.Printf("四川凌空天行 DNS Server 启动")
	exePath, err := os.Executable()
	dir := filepath.Dir(exePath)
	data, err := os.ReadFile(dir + "/app.yml")
	if err != nil {
		log.Printf("不存在app.yml,文件二次检查 yaml")
		data, err = os.ReadFile("app.yml")
		if err != nil {
			log.Printf("不存在app.yml文件,请创建一个app.yml文件，并添加相关配置")
			return
		}
	}

	err = yaml.Unmarshal(data, &config.ConfigData)
	go func() {
		log.Printf("后台管理端口:" + strconv.Itoa(config.ConfigData.Admin.Port))
		web.StartWebServer(config.ConfigData.Admin.Port)
	}()
	if config.ConfigData.Proxy.Open {
		go func() {
			log.Printf("HTTP代理端口:80")
			proxy.StartHttpServer(80)
		}()

		go func() {
			log.Printf("HTTPS代理端口:443")
			proxy.StartHttpsServer(443)
		}()

	}
	log.Printf("DNS端口:" + strconv.Itoa(config.ConfigData.Dns.Port))
	dnsServer := &dns.Server{Addr: ":" + strconv.Itoa(config.ConfigData.Dns.Port), Net: "udp"}
	service.DomainService{}.InitConfigProxy()
	service.ProxyService{}.InitProxy()
	log.Printf("初始化配置缓存完成")
	dnsServer.Handler = &handler.LktxDNSHandler{}
	if err := dnsServer.ListenAndServe(); err != nil {
		log.Fatalf("DNS服务启动失败: %v", err)
	}
}
